<?php

namespace ticky;

class controller {

    public $module = MODULE_NAME; // 当前模块名
    public $controlloer = CONTROLLER_NAME; // 当前控制器名
    public $action = ACTION_NAME; // 当前方法

    public function __construct() {
        // 控制器初始化
        $this->_initialize();
        // 前置操作方法
        if ($this->beforeActionList) {
            foreach ($this->beforeActionList as $method => $options) {
                is_numeric($method) ? $this->beforeAction($options) : $this->beforeAction($method, $options);
            }
        }
    }

    /**
     * 初始化操作
     * @access protected
     */
    protected function _initialize() {

    }

    /**
     * 前置操作
     * @access protected
     * @param  string $method  前置操作方法名
     * @param  array  $options 调用参数 ['only'=>[...]] 或者 ['except'=>[...]]
     * @return void
     */
    protected function beforeAction($method, $options = []) {
        if (isset($options['only'])) {
            if (is_string($options['only'])) {
                $options['only'] = explode(',', $options['only']);
            }

            if (!in_array($this->request->action(), $options['only'])) {
                return;
            }
        } elseif (isset($options['except'])) {
            if (is_string($options['except'])) {
                $options['except'] = explode(',', $options['except']);
            }

            if (in_array($this->request->action(), $options['except'])) {
                return;
            }
        }
        call_user_func([$this, $method]);
    }

    /**
     * @desc 将变量赋值给模板
     * @param $name
     * @param $value
     */
    public function assign($name, $value) {
        view::instance()->assign($name, $value);
    }

    /**
     * @desc 展示模板
     * @param null $viewName 模板名或模板完整路径
     */
    public function display($viewName, $module = null) {
        view::instance()->display($viewName, $module);
    }

    /**
     * @desc 重定向
     * @param $uri 跳转地址
     * @param int $refresh 延迟跳转时间
     */
    public function redirect($uri, $refresh = 0) {
        response::redirect($uri, $refresh);
    }

    /**
     * @desc ajax返回
     * @param array $data
     * @param $type
     */
    public function ajaxReturn($data, $type) {
        return response::ajax($data, $type);
    }

    /**
     * @desc cli命令行返回
     * @param string $message
     * @param $type
     */
    public function cliReturn($message, $type) {
        response::cli($message, $type);
    }

    /**
     * update tky_member set  `1` = '0' where  `uid` = "1"
     * changeTableVal/?table=tky_newsclass&id_name=classid&id_value=2&field=closed&value=1
     */
    public function changeTableVal() {
        $table = $_GET['table'];
        $id_name = $_GET['id_name'];
        $id_value = $_GET['id_value'];
        $field = $_GET['field'];
        $value = $_GET['value'];
        //changeTableVal/?table=tky_newsclass&id_name=classid&id_value=2&field=closed&value=1
        $data = array();
        $data[$field] = $value;
        //update tky_member set  `1` = '0' where  `uid` = "1"
        db($table)->where(array($id_name => $id_value))->update($data);
        echo 'OK';
    }

    /**
     * 验证码图像
     */
    public function code() {
        captcha::instance()->code();
    }

    public function cookie($name, $value = '') {
        $cookie = cookie::instance();
        if ($value == '') {
            return $cookie->get($name);
        } elseif (is_null($value)) {
            $cookie->delete($name);
        } elseif (isset($value)) {
            $cookie->set($name, $value);
        } else {
            return $cookie->get($name);
        }
    }

    /**
     * Session管理
     * @param string|array  $name session名称，如果为数组表示进行session设置
     * @param mixed         $value session值
     * @param string        $prefix 前缀
     * @return mixed
     */
    public function session($name, $value = '', $prefix = null) {
        if (is_array($name)) {
            // 初始化
            session::init($name);
        } elseif (is_null($name)) {
            // 清除
            session::clear('' === $value ? null : $value);
        } elseif ('' === $value) {
            // 判断或获取
            return 0 === strpos($name, '?') ? session::has(substr($name, 1), $prefix) : session::get($name, $prefix);
        } elseif (is_null($value)) {
            // 删除
            return session::delete($name, $prefix);
        } else {
            // 设置
            return session::set($name, $value, $prefix);
        }
    }

}
